class AsteroidWithPole: public AsteroidWithTax
{
public:
  float lambdaCibuki, betaCibuki;
  float a_bCibuki;
 
  AsteroidWithPole():AsteroidWithTax()
  {
  };

  void reset() // reset everything 
  {
    AsteroidWithTax::reset();
    lambdaCibuki=betaCibuki=a_bCibuki=-1000;
  };

  void print()
  {
    // For Table. S1
    printf("%06ld %20s %5.2f %4.2f\
 %7.4lf %7.4lf %7.4lf\
 %8.3f %7.3f %6.3f %6.3f %7.2f\
 %30s %06ld\
 %5.2f %5.2f\n",
           Number, Designation, H, G,
           ap, ep, sinip,
           D, sigmaD, pV, sigmapV, rotationPeriod,
           taxClasses, familyDavidN,
           astar, i_z);
    /*
    // classic output 
    printf("%06ld %20s %7s %5.2f %4.2f %7.4lf %7.4lf %7.4lf %8.3f %7.3f %5.3f %5.3f %6.2f %01d %30s\
 %06ld %02x %01d %02d %2d %2d %2d %2d %5.2f %5.2f\n",
    	   Number, Designation, pack, H, G, ap, ep, sinip,
    	   D, sigmaD, pV, sigmapV, rotationPeriod, hasWiseObs, taxClasses, familyDavidN,
	   refs[3], hasTax, (int)Fo, nW1,nW2,nW3,nW4,astar, i_z);
    
    /*
    // Cibulkova
    printf("%06ld %20s %7s %5.2f %4.2f %7.4lf %7.4lf %7.4lf %8.3f %7.3f %5.3f %5.3f %6.2f %01d %30s\
 %06ld %4d %4d %7.4f %7.4f\n",
    	   Number, Designation, pack, H, G, ap, ep, sinip,
    	   D, sigmaD, pV, sigmapV, rotationPeriod, hasWiseObs, taxClasses, familyDavidN,
	   (int)lambdaCibuki, (int)betaCibuki, a_bCibuki, eta);
    */
  };

  void print(int mode)
  {
    switch (mode) {
    case 0: print();
      return;
      break;
    case 1:
      printf("%06ld %20s %5.2f %4.2f %7.4lf %7.4lf %7.4lf %8.3f %7.3f %5.3f %5.3f %6.2f %01d %30s\
 %06ld %4d %4d %7.4f %7.4f\n",
	     Number, Designation, H, G, ap, ep, sinip,
	     D, sigmaD, pV, sigmapV, rotationPeriod, hasWiseObs, taxClasses, familyDavidN,
	     (int)lambdaCibuki, (int)betaCibuki, a_bCibuki, eta);
      return;
      break;
    case 2:
      printf("%06ld %20s %7s %5.2f %4.2f %7.4lf %7.4lf %7.4lf %8.3f %7.3f %5.3f %5.3f %6.2f %01d %30s\
 %06ld %02x %01d %02d %2d %2d %2d %2d %5.2f %5.2f\n",
	     Number, Designation, pack, H, G, ap, ep, sinip,
	     D, sigmaD, pV, sigmapV, rotationPeriod, hasWiseObs, taxClasses, familyDavidN,
	     refs[3], hasTax, (int)Fo, nW1,nW2,nW3,nW4,astar, i_z);
      return;
      break;
    case 3:
      // thermal inertia output
      double Gamma;  
      if (mass>0) Gamma = density/mass;
      else Gamma=-1;
      printf("%06ld %20s %5.2f %4.2f\
 %7.4lf %7.4lf %7.4lf		    \
 %8.3f %7.3f %5.3f %5.3f %6.2f	    \
 %30s %06ld			    \
 %5.2f %5.2f %6.1f\n",
	     Number, Designation, H, G,
	     ap, ep, sinip,
	     D, sigmaD, pV, sigmapV, rotationPeriod,
	     taxClasses, familyDavidN,
	     astar, i_z, Gamma);
      return;
    case 4:
      // for Data S1 Revision 2
      char primoFam=0;
      if ((pV<0.12)&&(D>0)&&(ap<2.5)&&(ap>2.1)&&(sinip<0.3))
	if ((1/D>-0.59*(ap-2.366)) && (1/D<-1*(ap-2.42)))
	  if (D<50)
	    primoFam=1;
	  else
	    primoFam=2;
      if ((pV<0.12)&&(D>0)&&(ap<2.5)&&(ap>2.1)&&(sinip<0.3))
	if ((1/D>-1*(ap-2.42))&&(familyAdditional==0))
	  primoFam=3;
      
          char tmp[28];
	  memset(tmp,0,28);
	  strncpy(tmp, taxClasses, 26);
	  // For Table. S1
	  printf("%06ld %20s %5.2f %4.2f\
 %7.4lf %7.4lf %7.4lf\
 %8.3f %7.3f %6.3f %6.3f %7.2f\
 %26s %06ld\
 %5.2f %5.2f %1d\n",
		 Number, Designation, H, G,
		 ap, ep, sinip,
		 D, sigmaD, pV, sigmapV, rotationPeriod,
		 tmp, familyDavidN,
		 astar, i_z, primoFam);      
	  return;
      break;
    }
  };
};
